package com.isunland.managesystem.utils;

import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import com.isunland.managesystem.entity.AttendanceSummaryStaffDialog;
import com.isunland.managesystem.entity.MessageContact;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
 * 对象功能: 本地搜索
 * 开发公司: 北京信普达系统工程有限公司
 * 开发人员: wangyanan
 * 创建时间: 2017/3/29 13:58
 */

public class LocalSearch {
  /**
   * 搜索人员
   */
  public static ArrayList<AttendanceSummaryStaffDialog.SummaryStaff> searchSummaryStaff(
      String queryStr, ArrayList<AttendanceSummaryStaffDialog.SummaryStaff> allContacts) {
    if (queryStr == null || allContacts == null) return null;

    ArrayList<AttendanceSummaryStaffDialog.SummaryStaff> resultList = new ArrayList<>();

    for (int i = 0; i < allContacts.size(); i++) {
      AttendanceSummaryStaffDialog.SummaryStaff item = allContacts.get(i);
      if (MyStringUtil.isContainsByFirstLetter(item.getName(), queryStr)
          || MyStringUtil.isContainsByFirstLetter(item.getDeptName(), queryStr)) {
        resultList.add(item);
      }
    }
    return resultList;
  }

  /**
   * 搜索联系人
   */
  public static ArrayList<MessageContact> searchMessageContact(String queryStr,
      ArrayList<MessageContact> list) {
    if (queryStr == null || list == null) return null;
    ArrayList<MessageContact> resultList = new ArrayList<>();
    for (int i = 0; i < list.size(); i++) {
      MessageContact item = list.get(i);
      if (MyStringUtil.isContainsByFirstLetter(item.getName(), queryStr)
          || MyStringUtil.isContainsByFirstLetter(item.getDeptName(), queryStr)
          || MyStringUtil.isContainsByFirstLetter(item.getMobile(), queryStr)
          || MyStringUtil.isContainsByFirstLetter(item.getEmail(), queryStr)
          || MyStringUtil.isContainsByFirstLetter(item.getBirthDate(), queryStr)) {
        resultList.add(item);
      }
    }
    return resultList;
  }

  /**
   * 搜索
   */
  public static <T> ArrayList<T> search(String queryStr, ArrayList<T> list, String[] fields) {
    if (queryStr == null
        || list == null
        || list.size() == 0
        || fields == null
        || fields.length == 0) {
      return null;
    }

    ArrayList<T> resultList = new ArrayList<>();
    Field[] columns = getFields(list.get(0), fields);
    if (columns == null || columns.length == 0) return null;
    for (int i = 0; i < list.size(); i++) {
      T item = list.get(i);
      //遍历成员变量,如果与待搜索字符匹配(包括拼音,首字母)就加入带匹配列表中
      boolean isContain = false;
      for (Field column : columns) {
        String columnStr = getFieldValue(item, column);
        if (columnStr == null) continue;
        if (MyStringUtil.isContainsByFirstLetter(columnStr, queryStr)) {
          isContain = true;
        }
      }
      if (isContain) {
        resultList.add(item);
      }
    }
    return resultList;
  }

  /**
   * 根据反射对象中获取成员变量的值
   *
   * @param column 成员
   * @param item 对象
   * @param <T> 对象类型
   * @return 字符类型的值
   */
  @Nullable public static <T> String getFieldValue(T item, Field column) {
    if (column == null || item == null) return null;
    column.setAccessible(true);
    String columnStr = null;
    try {
      columnStr = column.get(item).toString();
    } catch (IllegalAccessException e) {
      return null;
    }
    return columnStr;
  }

  /**
   * 根据反射对象中获取成员变量的值
   *
   * @param column 成员
   * @param item 对象
   * @param <T> 对象类型
   * @return 字符类型的值
   */
  @Nullable public static <T> String getFieldValue(T item, String column) {
    if (column == null || item == null) return null;
    try {
      Field field = item.getClass().getDeclaredField(column);
      field.setAccessible(true);
      return field.get(item).toString();
    } catch (Exception e) {
      e.printStackTrace();
      return "";
    }
  }

  @NonNull public static <T> Field[] getFields(T obj, String[] fields) {
    if (obj == null || fields == null || fields.length == 0) return null;
    Field[] columns = new Field[fields.length];
    try {
      for (int i = 0; i < fields.length; i++) {
        //设置字段可更改
        Field field = obj.getClass().getDeclaredField(fields[i]);
        field.setAccessible(true);
        columns[i] = field;
      }
    } catch (Exception e) {

    }
    return columns;
  }

  /**
   * 多选回传时的再次选中,根据一个拼接的字串,还原一个map.这个map传给adapter就会适配选中状态
   *
   * @param joinStr 逗号分隔的字串.
   * @param list 列表
   * @param field 字串代表的属性
   * @param <T> 对象
   * @return map
   */
  public static <T> HashMap<T, Boolean> getSelectMap(String joinStr, List<T> list, String field) {
    if (TextUtils.isEmpty(joinStr)
        || list == null
        || list.size() == 0
        || field == null
        || field.trim().length() == 0) {
      return null;
    }
    HashMap<T, Boolean> map = new HashMap<>();
    ArrayList<String> splitList = MyStringUtil.splitStr(joinStr, MyStringUtil.COMMA);
    if (splitList == null) return map;
    for (T item : list) {
      if (splitList.contains(getFieldValue(item, field))) {
        map.put(item, true);
      }
    }
    return map;
  }
}
